home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / game / board / Crafty-15.19.lha / crafty-15.19 / src / epddefs.h < prev    next >
Text File  |  1998-09-13  |  27KB  |  1,017 lines

  1. #if !defined(EPDDEFS_INCLUDED)
  2. #  define EPDDEFS_INCLUDED
  3. /*>>> epddefs.h: Extended Position Description definitions */
  4.  
  5. /* Revised: 1996.06.23 */
  6.  
  7. /*
  8. Copyright (C) 1996 by Steven J. Edwards (sje@mv.mv.com)
  9. All rights reserved.  This code may be freely redistibuted and used by
  10. both research and commerical applications.  No warranty exists.
  11. */
  12.  
  13. /*
  14. Everything in this source file is independent of the host program.
  15. Requests for changes and additions should be communicated to the author
  16. via the e-mail address given above.
  17. */
  18.  
  19. /*
  20. This file was originally prepared on an Apple Macintosh using the
  21. Metrowerks CodeWarrior 6 ANSI C compiler.  Tabs are set at every
  22. four columns.  Further testing and development was performed on a
  23. generic PC running Linux 1.3.20 and using the gcc 2.7.0 compiler.
  24. */
  25.  
  26. /* inclusion telltale */
  27.  
  28. #if (!defined(_epddefs))
  29. #define _epddefs 1
  30.  
  31. /* subprogram storage class for non-statics (usually empty definition) */
  32.  
  33. #define nonstatic
  34.  
  35. /* a bit */
  36.  
  37. #define bit 0x01
  38.  
  39. /* bit positions */
  40.  
  41. #define bit_00 (bit <<  0)
  42. #define bit_01 (bit <<  1)
  43. #define bit_02 (bit <<  2)
  44. #define bit_03 (bit <<  3)
  45. #define bit_04 (bit <<  4)
  46. #define bit_05 (bit <<  5)
  47. #define bit_06 (bit <<  6)
  48. #define bit_07 (bit <<  7)
  49. #define bit_08 (bit <<  8)
  50. #define bit_09 (bit <<  9)
  51. #define bit_10 (bit << 10)
  52. #define bit_11 (bit << 11)
  53. #define bit_12 (bit << 12)
  54. #define bit_13 (bit << 13)
  55. #define bit_14 (bit << 14)
  56. #define bit_15 (bit << 15)
  57.  
  58. /* bit width constants */
  59.  
  60. #define nybbW  4
  61. #define byteW  8
  62.  
  63. /* simple masks */
  64.  
  65. #define nybbM 0x000f
  66.  
  67. /* useful types */
  68.  
  69. typedef void *voidptrT;
  70. typedef unsigned char byteT, *byteptrT;
  71. typedef char *charptrT;
  72. typedef short int siT, *siptrT;
  73. typedef long int liT, *liptrT;
  74. typedef float srT, *srptrT;
  75. typedef double lrT, *lrptrT;
  76. typedef FILE *fptrT;
  77.  
  78. /* text I/O buffer length */
  79.  
  80. #define tL 256
  81.  
  82. /* EPD I/O buffer length */
  83.  
  84. #define epdL 4096
  85.  
  86. /* the standard algebraic notation character vector type */
  87.  
  88. #define sanL 16 /* must be at least 8; extra room for alternatives */
  89.  
  90. typedef char sanT[sanL];
  91. typedef sanT *sanptrT;
  92.  
  93. /* SAN style attributes, priority ordered (used for encoding) */
  94.  
  95. typedef siT ssaT;
  96. #define ssaL 12
  97. #define ssa_nil (-1)
  98.  
  99. #define ssa_capt  0 /* 5 way: capture indicator */
  100. #define ssa_case  1 /* 2 way: letter case */
  101. #define ssa_chec  2 /* 3 way: checking */
  102. #define ssa_cast  3 /* 5 way: castling */
  103. #define ssa_prom  4 /* 4 way: promoting */
  104. #define ssa_ptar  5 /* 2 way: pawn target rank skip */
  105. #define ssa_chmt  6 /* 4 way: checkmating */
  106. #define ssa_epct  7 /* 2 way: en passant capture */
  107. #define ssa_draw  8 /* 2 way: drawing */
  108. #define ssa_move  9 /* 2 way: movement indicator */
  109. #define ssa_edcf 10 /* 2 way: extra disambiguating character (file) */
  110. #define ssa_edcr 11 /* 2 way: extra disambiguating character (rank) */
  111.  
  112. /* SAN style vector */
  113.  
  114. typedef siT ssavT[ssaL];
  115.  
  116. /* colors (ordering is critical) */
  117.  
  118. typedef siT cT, *cptrT;
  119. #define cQ 2
  120. #define cL (bit << cQ)
  121. #define rcQ 1
  122. #define rcL (bit << rcQ)
  123. #define c_nil (-1)
  124.  
  125. #define c_w 0 /* white */
  126. #define c_b 1 /* black */
  127. #define c_v 2 /* vacant */
  128. #define c_x 3 /* extra */
  129.  
  130. /* pieces (ordering is critical) */
  131.  
  132. typedef siT pT, *pptrT;
  133. #define pL 8
  134. #define rpL 6
  135. #define p_nil (-1)
  136.  
  137. #define p_p 0 /* pawn */
  138. #define p_n 1 /* knight */
  139. #define p_b 2 /* bishop */
  140. #define p_r 3 /* rook */
  141. #define p_q 4 /* queen */
  142. #define p_k 5 /* king */
  143. #define p_v 6 /* vacant */
  144. #define p_x 7 /* extra */
  145.  
  146. /* color piece combinations (ordering is critical) */
  147.  
  148. typedef siT cpT;
  149. #define cpL 16
  150. #define rcpL 12
  151. #define cp_nil (-1)
  152.  
  153. #define cp_wp  0 /* white pawn */
  154. #define cp_wn  1 /* white knight */
  155. #define cp_wb  2 /* white bishop */
  156. #define cp_wr  3 /* white rook */
  157. #define cp_wq  4 /* white queen */
  158. #define cp_wk  5 /* white king */
  159. #define cp_bp  6 /* black pawn */
  160. #define cp_bn  7 /* black knight */
  161. #define cp_bb  8 /* black bishop */
  162. #define cp_br  9 /* black rook */
  163. #define cp_bq 10 /* black queen */
  164. #define cp_bk 11 /* black king */
  165. #define cp_v0 12 /* vacant */
  166. #define cp_x0 13 /* extra 0 */
  167. #define cp_x1 14 /* extra 1 */
  168. #define cp_x2 15 /* extra 2 */
  169.  
  170. /* ranks */
  171.  
  172. typedef siT rankT;
  173. #define rankM (0x0007)
  174. #define rankQ 3
  175. #define rankL (bit << rankQ)
  176. #define rank_nil (-1)
  177.  
  178. #define rank_1 0
  179. #define rank_2 1
  180. #define rank_3 2
  181. #define rank_4 3
  182. #define rank_5 4
  183. #define rank_6 5
  184. #define rank_7 6
  185. #define rank_8 7
  186.  
  187. /* files */
  188.  
  189. typedef siT fileT;
  190. #define fileM (0x0007)
  191. #define fileQ 3
  192. #define fileL (bit << fileQ)
  193. #define file_nil (-1)
  194.  
  195. #define file_a 0 /* QR */
  196. #define file_b 1 /* QN */
  197. #define file_c 2 /* QB */
  198. #define file_d 3 /* Q */
  199. #define file_e 4 /* K */
  200. #define file_f 5 /* KB */
  201. #define file_g 6 /* KN */
  202. #define file_h 7 /* KR */
  203.  
  204. /* location mappings */
  205.  
  206. #define map_sq(r, f) (((r) << fileQ | (f)))
  207. #define map_file(sq) ((sq) & 0x07)
  208. #define map_rank(sq) ((sq) >> fileQ)
  209.  
  210. /* squares */
  211.  
  212. typedef siT sqT, *sqptrT;
  213. #define sqM (0x003f)
  214. #define sqQ (rankQ + fileQ)
  215. #define sqL (bit << sqQ)
  216. #define sq_nil (-1)
  217.  
  218. #define sq_a1 map_sq(rank_1, file_a)
  219. #define sq_b1 map_sq(rank_1, file_b)
  220. #define sq_c1 map_sq(rank_1, file_c)
  221. #define sq_d1 map_sq(rank_1, file_d)
  222. #define sq_e1 map_sq(rank_1, file_e)
  223. #define sq_f1 map_sq(rank_1, file_f)
  224. #define sq_g1 map_sq(rank_1, file_g)
  225. #define sq_h1 map_sq(rank_1, file_h)
  226. #define sq_a2 map_sq(rank_2, file_a)
  227. #define sq_b2 map_sq(rank_2, file_b)
  228. #define sq_c2 map_sq(rank_2, file_c)
  229. #define sq_d2 map_sq(rank_2, file_d)
  230. #define sq_e2 map_sq(rank_2, file_e)
  231. #define sq_f2 map_sq(rank_2, file_f)
  232. #define sq_g2 map_sq(rank_2, file_g)
  233. #define sq_h2 map_sq(rank_2, file_h)
  234. #define sq_a3 map_sq(rank_3, file_a)
  235. #define sq_b3 map_sq(rank_3, file_b)
  236. #define sq_c3 map_sq(rank_3, file_c)
  237. #define sq_d3 map_sq(rank_3, file_d)
  238. #define sq_e3 map_sq(rank_3, file_e)
  239. #define sq_f3 map_sq(rank_3, file_f)
  240. #define sq_g3 map_sq(rank_3, file_g)
  241. #define sq_h3 map_sq(rank_3, file_h)
  242. #define sq_a4 map_sq(rank_4, file_a)
  243. #define sq_b4 map_sq(rank_4, file_b)
  244. #define sq_c4 map_sq(rank_4, file_c)
  245. #define sq_d4 map_sq(rank_4, file_d)
  246. #define sq_e4 map_sq(rank_4, file_e)
  247. #define sq_f4 map_sq(rank_4, file_f)
  248. #define sq_g4 map_sq(rank_4, file_g)
  249. #define sq_h4 map_sq(rank_4, file_h)
  250. #define sq_a5 map_sq(rank_5, file_a)
  251. #define sq_b5 map_sq(rank_5, file_b)
  252. #define sq_c5 map_sq(rank_5, file_c)
  253. #define sq_d5 map_sq(rank_5, file_d)
  254. #define sq_e5 map_sq(rank_5, file_e)
  255. #define sq_f5 map_sq(rank_5, file_f)
  256. #define sq_g5 map_sq(rank_5, file_g)
  257. #define sq_h5 map_sq(rank_5, file_h)
  258. #define sq_a6 map_sq(rank_6, file_a)
  259. #define sq_b6 map_sq(rank_6, file_b)
  260. #define sq_c6 map_sq(rank_6, file_c)
  261. #define sq_d6 map_sq(rank_6, file_d)
  262. #define sq_e6 map_sq(rank_6, file_e)
  263. #define sq_f6 map_sq(rank_6, file_f)
  264. #define sq_g6 map_sq(rank_6, file_g)
  265. #define sq_h6 map_sq(rank_6, file_h)
  266. #define sq_a7 map_sq(rank_7, file_a)
  267. #define sq_b7 map_sq(rank_7, file_b)
  268. #define sq_c7 map_sq(rank_7, file_c)
  269. #define sq_d7 map_sq(rank_7, file_d)
  270. #define sq_e7 map_sq(rank_7, file_e)
  271. #define sq_f7 map_sq(rank_7, file_f)
  272. #define sq_g7 map_sq(rank_7, file_g)
  273. #define sq_h7 map_sq(rank_7, file_h)
  274. #define sq_a8 map_sq(rank_8, file_a)
  275. #define sq_b8 map_sq(rank_8, file_b)
  276. #define sq_c8 map_sq(rank_8, file_c)
  277. #define sq_d8 map_sq(rank_8, file_d)
  278. #define sq_e8 map_sq(rank_8, file_e)
  279. #define sq_f8 map_sq(rank_8, file_f)
  280. #define sq_g8 map_sq(rank_8, file_g)
  281. #define sq_h8 map_sq(rank_8, file_h)
  282.  
  283. /* regular board */
  284.  
  285. typedef union rbU
  286.     {
  287.     cpT rbm[rankL][fileL]; /* rank/file indexing */
  288.     cpT rbv[sqL];          /* square indexing */
  289.     } rbT, *rbptrT;
  290.  
  291. /* nybble board vector */
  292.  
  293. #define nbL (sqL / (byteW / nybbW))
  294. typedef byteT nbvT[nbL];
  295.  
  296. /* flanks */
  297.  
  298. typedef siT flankT;
  299. #define flankL 2
  300. #define flank_nil (-1)
  301.  
  302. #define flank_k 0 /* kingside */
  303. #define flank_q 1 /* queenside */
  304.  
  305. /* direction indices */
  306.  
  307. typedef siT dxT;
  308. #define dxQ 4
  309. #define dxL (bit << dxQ)
  310. #define dx_nil (-1)
  311.  
  312. #define dx_0  0
  313. #define dx_1  1
  314. #define dx_2  2
  315. #define dx_3  3
  316. #define dx_4  4
  317. #define dx_5  5
  318. #define dx_6  6
  319. #define dx_7  7
  320. #define dx_8  8
  321. #define dx_9  9
  322. #define dx_a 10
  323. #define dx_b 11
  324. #define dx_c 12
  325. #define dx_d 13
  326. #define dx_e 14
  327. #define dx_f 15
  328.  
  329. /* direction vector displacements */
  330.  
  331. typedef siT dvT;
  332.  
  333. #define dv_0 (( 0 * fileL) + 1)
  334. #def